package gui_kalenderpanel;
import java.awt.*;

import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;

import javax.swing.*;
import javax.swing.border.Border;

import model.*;


public class NotisPanel extends JPanel implements FocusListener, PropertyChangeListener{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	
	private Avtale avtale;
	
	private final static ImageIcon moeteIkon = new ImageIcon("moete.png");
    private final static ImageIcon notisIkon = new ImageIcon("notis.png");
    
    private JPanel beskrivelsePanel;
    
    private int antGodtatte;
    private int antForkastet;
    private int antIkkeSvart;
    
    private ArrayList<Deltager> deltagere;
	
	//GUI
	private JPanel ikonPanel;
	private GridBagConstraints c;
	
	private StatusPanel godtattPanel, forkastetPanel, ikkeSvartPanel;
	
	
	public NotisPanel(Avtale avtaleInput){
		
		addFocusListener(this);
		
		avtale = avtaleInput;
		
		setToolTipText("<html><h1>" + avtale.getBeskrivelse() +"</h1> "+" <br /> "+avtale.getSted()+"</html>");
		
		//Gui
		setBackground(Color.WHITE);
		ikonPanel = new JPanel();
		ikonPanel.setBackground(Color.WHITE);
		
		this.setLayout(new GridBagLayout());	
		c = new GridBagConstraints();
		c.anchor = GridBagConstraints.WEST;
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 1;
		
		
		//Beskrivelse
		c.gridx = 0;
		c.gridy = 0;
		c.gridwidth = 3;
		
		beskrivelsePanel = new JPanel();  
		
		String beskrivelse = (avtale.getBeskrivelse().length()<12)? avtale.getBeskrivelse(): avtale.getBeskrivelse().substring(0, 12)+"."; 
		
		beskrivelsePanel.add(new JLabel(beskrivelse));
		beskrivelsePanel.setBackground(Color.WHITE);
		add(beskrivelsePanel,c);
		
		
		//Finner p�meldte osv.
		deltagere = avtaleInput.getDeltagere();
		leggTilLyttere();
		
		if(deltagere.size()!=0){
			
			visMoete(deltagere);
			
			
		}else{
			visMemo();
		}
		
		
		revalidate();
		
	}
	
	public void leggTilLyttere(){
		
		for(Deltager deltager:deltagere){
			
			deltager.addPropertyChangeListener(this);
		}
		
	}

	public void visMemo(){
		
		
		if(avtale.getSlutt()-avtale.getStart()>1){
			
			JLabel ikon = new JLabel();
			ikon.setIcon(notisIkon);
			
			c.gridx = 0;
			c.gridy = 1;
			
			ikonPanel.add(ikon);
			
			add(ikonPanel,c);
			
		}
		
	}
	
	
	public void visMoete(ArrayList<Deltager> deltagere){
		
		int inkrement = 0;
		
		
		//Teller opp #deltagere
		for(int i=0; i<deltagere.size();i++){
			
			
			if(deltagere.get(i).getStatus()==Status.godtatt)
				{
				antGodtatte++;
				}
			else if(deltagere.get(i).getStatus()==Status.forkastet){
				antForkastet++;
			}
			else {
				antIkkeSvart++;
			}
		}
		
		
		
		if(avtale.getSlutt()-avtale.getStart()>1){
			
			c.gridx = 0;
			c.gridy = 1;
			c.gridwidth = 3;
			
			
			JLabel ikon = new JLabel();
			ikon.setIcon(moeteIkon);
			ikonPanel.add(ikon);
			
			add(ikonPanel,c);
			
			inkrement++;
		}
		
		
		c.anchor = GridBagConstraints.SOUTH;
		
		c.gridwidth = 1;
		
		c.gridx = 0;
		c.gridy = 1+inkrement;
		
		godtattPanel = new StatusPanel(Status.godtatt, antGodtatte); 
		this.add(godtattPanel,c);
		
		
		c.gridx = 1;
		c.gridy = 1+inkrement;
		forkastetPanel = new StatusPanel(Status.forkastet, antForkastet);
		this.add(forkastetPanel,c);
		
		
		c.gridx = 2;
		c.gridy = 1+inkrement;
		ikkeSvartPanel = new StatusPanel(Status.ikkeSvart, antIkkeSvart);
		this.add(ikkeSvartPanel,c);
	
		
	}
	
	public Avtale getAvtale() {
		return avtale;
	}
	
	private class StatusPanel extends JPanel{
	
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		JLabel antallLabel;
		
		public void setAntallLabel(int antall){
			
			antallLabel.setText(antall+"");
		}
		
		public StatusPanel(Status status, int antall){
			
			antallLabel = new JLabel(antall+"");
			add(antallLabel);
			
			if(status == Status.godtatt)
			{
				setBackground(Color.green);
			
			}else if(status == Status.forkastet){
				
				setBackground(Color.RED);
			}
			else {
				setBackground(Color.YELLOW);
			}
			
		}
	}

	@Override
	public void focusGained(FocusEvent arg0) {
		// TODO Auto-generated method stub
		setBorder(BorderFactory.createLineBorder(Color.RED));
	}


	@Override
	public void focusLost(FocusEvent arg0) {
		// TODO Auto-generated method stub
		
		setBorder(BorderFactory.createLineBorder(Color.BLACK));
	}

	public void oppdaterDeltagere(Status status,int inkrement){
		
		if(status==Status.godtatt)
		{
			antGodtatte += inkrement;
			godtattPanel.setAntallLabel(antGodtatte);
		}
		else if(status==Status.forkastet){
			antForkastet += inkrement;
			forkastetPanel.setAntallLabel(antForkastet);
		}
		else {
			antIkkeSvart += inkrement;
			ikkeSvartPanel.setAntallLabel(antIkkeSvart);
		}
	}
	
	@Override
	public void propertyChange(PropertyChangeEvent evt) {
		// TODO Auto-generated method stub
		
		oppdaterDeltagere((Status)evt.getNewValue(), 1);
		oppdaterDeltagere((Status)evt.getOldValue(), -1);
		System.out.println("sdfsdfsdfghdfhdfh");
		
	}

	
//	
//	public static void main(String[] args){
//		
//		
//		Avtale avtaleInput = new Avtale("Jens","Test","Rom 12", 15, 4, 2012, 12, 14);
//		
//		avtaleInput.leggeTilDeltagere(new Deltager("Beate", "godtatt"));
//		avtaleInput.leggeTilDeltagere(new Deltager("Per", "godtatt"));
//		avtaleInput.leggeTilDeltagere(new Deltager("Morten", "godtatt"));
//		avtaleInput.leggeTilDeltagere(new Deltager("Finn", "avbud"));
//		avtaleInput.leggeTilDeltagere(new Deltager("Ola", "avbud"));
//		avtaleInput.leggeTilDeltagere(new Deltager("Trude", "ikke_svart"));
//		
//		JFrame frame = new JFrame("Kalender");
//		frame.getContentPane().add(new NotisPanel(avtaleInput));
//		
//		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//		
//		frame.pack();
//		frame.setVisible(true);
//		
//		
//	}

}
